/**
 * 带重试的请求方法
 * @async
 * @param {Function} fn - 要执行的函数
 * @param {number} retries - 重试次数
 * @returns {Promise<any>}
 */
export const fetchWithRetry = async (fn, retries = 3) => {
  for (let i = 0; i < retries; i++) {
    try {
      return await fn()
    } catch (error) {
      if (i === retries - 1) throw error
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)))
    }
  }
}

// 使用命名导出而不是默认导出的原因：
// 1. 更好的tree-shaking支持，打包工具可以更精确地优化代码
// 2. 更清晰的导入语法，调用方需要使用解构语法导入，明确依赖关系
// 3. 符合Vue3组合式API的导出规范，保持项目风格统一

/**关于导出
 * 
在 JavaScript 中，`export` 关键字可以与函数声明结合使用来导出模块。然而，你提到的 `export function fetchWithRetry async()` 语法并不正确。如果你想定义一个异步函数并导出它，有两种主要方式来实现这一点：

### 方法一：直接在函数声明时使用 `async`

你可以先定义一个异步函数，然后使用 `export` 导出它：

```javascript
async function fetchWithRetry(fn, retries = 3) {
  for (let i = 0; i < retries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (i === retries - 1) throw error;
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
    }
  }
}

export { fetchWithRetry };
```

或者更简洁地直接在声明时导出：

```javascript
export async function fetchWithRetry(fn, retries = 3) {
  for (let i = 0; i < retries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (i === retries - 1) throw error;
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
    }
  }
}
```

这两种方法都会将 `fetchWithRetry` 函数作为命名导出。

### 方法二：使用函数表达式并以 `const` 导出

正如你在问题中最初展示的那样，另一种常见的做法是使用函数表达式，并通过 `const` 来定义和导出：

```javascript
export const fetchWithRetry = async (fn, retries = 3) => {
  for (let i = 0; i < retries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (i === retries - 1) throw error;
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
    }
  }
};
```

### 总结

- **直接在声明时导出**（方法一）可以使代码更加直观，特别是当你只需要导出这个单一函数时。
- **使用函数表达式并以 `const` 导出**（方法二）提供了更大的灵活性，比如在定义之后、导出之前对函数进行一些处理。

根据你的偏好和具体需求选择合适的方式即可。两种方法都是有效的，并且都支持异步函数的定义和导出。如果你希望保持代码的简洁性和清晰性，推荐直接使用第二种方法，因为它不仅简洁而且广泛被理解和支持。但是，如果出于某些原因你需要在导出前对函数做一些额外的操作，则第一种方法可能更适合。
 */
